﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;

namespace console_pictures_viewer
{
    class ImageProcessor
    {
        private String OriginalDirectory = "";
        private List<FileName> OriginalFiles = new List<FileName>();
        private Progress processProgress = null;

        public ImageProcessor()
        {
            OriginalDirectory = Directory.GetCurrentDirectory();
        }

        public void StartProcess()
        {
            FindImagesInFolder();
            ProcessAllImages("Результат");
        }

        private void ProcessAllImages(string directoryName)
        {
            // create subdirectory for new images
            DirectoryInfo dirInfo = Directory.CreateDirectory(OriginalDirectory + "\\" + directoryName);

            processProgress = new Progress(OriginalFiles.Count - 1, 0);

            // обрабатываем фотографии
            for (int i = 0; i < OriginalFiles.Count; i++)
            {
                Bitmap oldImage = new Bitmap(OriginalFiles[i].GetFullName());
                float width = oldImage.Width / 2;
                float height = oldImage.Height / 2;

                Bitmap newImage = new Bitmap((int)width, (int)height);
                Graphics grPhoto = Graphics.FromImage(newImage);
                grPhoto.Clear(System.Drawing.Color.FromArgb(0, 255, 255, 255));

                grPhoto.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                grPhoto.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                grPhoto.DrawImage(oldImage, 0, 0, width, height);
                grPhoto.Flush();

                // получим дату создания снимка
                PropertyItem[] props = oldImage.PropertyItems;
                string shotDate = "";
                foreach (PropertyItem prop in props)
                {
                    if (prop.Id == 36868 && prop.Type == 2)
                    {
                        shotDate = Encoding.ASCII.GetString(prop.Value, 0, prop.Len - 1);
                    }
                }
                oldImage.Dispose(); // освободить изображение из обработчика

                shotDate = DateInStringFormatToFileViableString(shotDate);// изменить строку даты на строку, 
                //которую можно использовать в названии файла(без запрещенных символов)

                String fileToDelete = dirInfo.FullName + "\\" + OriginalFiles[i].GetNameWithExtension();
                File.Delete(fileToDelete); // удаляем старый файл если он уже есть в каталоге dirInfo.FullName
                String fileToSave = dirInfo.FullName + "\\" + shotDate + " " + OriginalFiles[i].GetNameWithExtension();
                newImage.Save(fileToSave, System.Drawing.Imaging.ImageFormat.Jpeg); // сохраняем новый файл в нужном формате

                processProgress.SetCurrent(i);
                processProgress.Display();
            }
        }

        private string DateInStringFormatToFileViableString(string str)
        {
            string date_to_file_str = str;
            date_to_file_str = date_to_file_str.Replace(':', '_');
            date_to_file_str = date_to_file_str.Replace('\\', '_');
            date_to_file_str = date_to_file_str.Replace('/', '_');
            date_to_file_str = date_to_file_str.Replace('<', '_');
            date_to_file_str = date_to_file_str.Replace('>', '_');
            date_to_file_str = date_to_file_str.Replace('*', '_');
            date_to_file_str = date_to_file_str.Replace('?', '_');
            return date_to_file_str;
        }

        private void FindImagesInFolder()
        {
            FindFilesByExtension("jpeg");
            FindFilesByExtension("jpg");
            FindFilesByExtension("bmp");
            FindFilesByExtension("png");            
        }

        private void FindFilesByExtension(string extension)
        {
            String[] fileNames = Directory.GetFiles(OriginalDirectory, "*." + extension);
            foreach (var fileName in fileNames)
            {
                OriginalFiles.Add(new FileName(fileName));
            }
        }
    }
}
